package com.xxxtea.redis;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * Redis配置类
 * 
 * 负责配置Redis连接和序列化方式，包括：
 * - 自定义RedisTemplate（RedisHelper）
 * - Jackson JSON序列化配置
 * - 内存优化（null值不序列化）
 * - 键值序列化器设置
 * 
 * @author badman
 * @since 1.0.0
 */
@Configuration
public class RedisConfig {
	
	/**
	 * 配置自定义的RedisTemplate
	 * 
	 * 创建RedisHelper实例并配置序列化方式：
	 * - 值序列化：使用Jackson JSON序列化，null值不序列化以节省内存
	 * - 键序列化：使用字符串序列化
	 * - Hash值序列化：使用Jackson JSON序列化
	 * - Hash键序列化：使用字符串序列化
	 * 
	 * @param redisConnectionFactory Redis连接工厂
	 * @return 配置好的RedisHelper实例
	 */
	@Bean
	public RedisHelper redisTemplate(RedisConnectionFactory redisConnectionFactory) {
		// 创建自定义的RedisHelper实例
		RedisHelper redisHelper = new RedisHelper();
		// 设置Redis连接工厂
		redisHelper.setConnectionFactory(redisConnectionFactory);
		
		// 自定义jackson序列化逻辑
		Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
		
		// 配置ObjectMapper，节省内存，null数据不进行序列化
		ObjectMapper objectMapper = new ObjectMapper();
		objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
		serializer.setObjectMapper(objectMapper);
		
		// 设置redis序列化器
		// 值序列化器：使用Jackson JSON序列化
		redisHelper.setValueSerializer(serializer);
		// Hash值序列化器：使用Jackson JSON序列化
		redisHelper.setHashValueSerializer(serializer);
		// 键序列化器：使用字符串序列化
		redisHelper.setKeySerializer(RedisSerializer.string());
		// Hash键序列化器：使用字符串序列化
		redisHelper.setHashKeySerializer(RedisSerializer.string());
		
		// 初始化RedisHelper
		redisHelper.afterPropertiesSet();
		return redisHelper;
	}
}
